/*
 *  PPObject.h
 *  PigeonsFoundation
 *
 *  Created by Jacob Basham on 1/22/07.
 *  Copyright 2007, PaperPigeons.net
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without 
 *  modification, are permitted provided that the following conditions 
 *  are met:
 *  1. Redistributions of source code must retain the above copyright 
 *     notice, this list of conditions and the following disclaimer.
 *	2. Redistributions in binary form must reproduce the above copyright 
 *	   notice, this list of conditions and the following disclaimer in 
 *	   the documentation and/or other materials provided with the distribution.
 *	3. Neither the name of PaperPigeons.net nor the names of its contributors 
 *	   may be used to endorse or promote products derived from this software 
 *	   without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 *	"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 *	LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 *	FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
 *	COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 *	INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
 *	BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 *	LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 *	CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 *	LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
 *	IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 *	POSSIBILITY OF SUCH DAMAGE.
 */

#import <Foundation/Foundation.h>


/*!
    @class
    @abstract    Basic object.
    @discussion  Wraps NSMutableDictionary
*/
@interface PPObject : NSObject 
{
	id _parent;
	NSMutableDictionary * _dictionary;
}


/*!
    @method     
    @abstract   Allocate and initialize an object.
*/
+ (id)object;

/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
+ (id)objectWithParent:(id)parent;

/*!
    @method     
    @abstract   Initializes object.
*/
- (id)init;

/*!
    @method     
    @abstract   Return value for key.
    @param key Key to return value for
	@result Value for said key.
*/
- (id)valueForKey:(NSString *)key;


/*!
    @method     
    @abstract   Set objects property.
    @discussion Set object value for property key.
	@param value Value to be set.
	@param key Key to store value as.
*/
- (void)setValue:(id)value forKey:(NSString *)key;


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (void)addEntriesFromDictionary:(NSDictionary *)dictionary;


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (id)parent;


/*!
    @method     
    @abstract   (brief description)
    @discussion (comprehensive description)
*/
- (void)setParent:(id)parent;

/*!
    @method     
    @abstract   Deallocs object.
    @discussion Releases internal data store.
*/
- (void)dealloc;

@end

/*!
    @class
    @abstract    Records changed properties.
    @discussion  Stores the keys of changed properties.
*/
@interface PPSmartObject : PPObject 
{
	NSMutableSet * _changes;
}

/*!
    @method     
    @abstract   Initializes smart object.
*/
- (id)init;


/*!
    @method     
    @abstract   Sets value for key.
    @discussion Sets value for key and stores key. Keys are stored in a set
					so keys are not stored twice if changed twice.
	@param value Value to set.
	@param key Key to set value for.
*/
- (void)setValue:(id)value forKey:(NSString *)key;


/*!
    @method     
    @abstract   Return array of keys which have been modified.
    @result Array of modified keys.
*/
- (NSArray *)changedKeys;


/*!
    @method     
    @abstract   Return dictionary of changed properties.
    @result Dictionary of properties which have changed.
*/
- (NSDictionary *)changedProperties;


/*!
    @method     
    @abstract   Reset stored list of changed properties.
*/
- (void)resetChangedProperties;


/*!
    @method     
    @abstract   Releases internal set.
*/
- (void)dealloc;

@end

